perm filename DSKRIM.FAI[SS,SYS] blob
sn#775737 filedate 1984-11-10 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00019 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00006 00002 TYPXFR DEBSW DSKDSW DSKDBG KLBOOT RHDSK FT1DSK EXTNEW KACODE NPACKS EXTNEW F A B C D E H J K L M P1 P2 P3 P4 T1 T2 T3 N T TT P HILOC NUFDWD RBO CUADR APR PI KLPAG CCA TTY C1A C1B DTE0 DTFLG DTF11 DTCMD DONG11 SWEEPB PIOFF DSTART DSTART KLEPT A%FP0 KLEPT R2WLSH RECSIZ RTLSIZ DATRPB RTLSIZ DATRPB WDPCHN DATSIZ BLKSIZ
C00015 00003 PTPC PTR PNCHGO GO1 GO2 PUNCHC PUNCH RIMLDR RIMLDL RIMPDL OBUF BOOTLO BOOTBG BOOTBG XBUF XBUF BOOTBG BOOTBG XBUF NDATA BDATA KLEPT A%FP0
C00021 00004 C1SBI C1RSI C1SRUN C1CONT C1SCH C1RST C1CCIF C1INTE C1INTD C1SCF1 C1CCF1 C1MPCN C1LCD C1LPT C1SYSR C1SCAN C1SDIA CIF CF1 CF2 C1UCHK
C00026 00005 C1CMD C1MRT C1JMP C1TIO C1IWC C1BAK C1NATM C1BYTM C1CBYT C1SLE C1CEC C1NOC C1RPT C1CCW C1ISW C1PTPE C1PTNX C1IQF C1PPTR C1PCW C1BW C1STA C1HLT C1LE C1SE C1PE C1NXM C1BPE C1SSE C1PCMA C1STB C1STC C1INST
C00032 00006 MFDLOC TRKCYL CYLPK TRKPK NXTQQQ A NXTQQQ NXTQQQ DPTRBP DPTEBP DPTRBP DPTEBP
C00037 00007 DSKDMP.DMP FORMAT
C00041 00008 LOWEST BOOT BOOT1 BOOTL1 BOOTL2 BOOTL3 NOMFD NODSKD NOSYS
C00049 00009 LOWEST DSKDMP DSKDM0 DSKDM1 DSKDM2 DSKDL DSKDL2 DSKDL1 DSKDRO DSKDAL DSKAL1 QQQ DSKDGO CMDS NCMDS CMDDSP SSTRTA SSTRT1 SSTRT2 START LOADGO NOMUCK MERGE LOAD LOADN LOADIT LDIT0 LDIT0A LDIT1 LDIT3 LDIT4 LDIT2 LDLP LDLP1 LDLP3 FILES DUMP KILL NSA FNF
C00065 00010 FILSET FILSE0 FILSE1 FILSIX FILSI1 RADJ RADJ1
C00070 00011 SRCH SRCH1 SRCH2 SRCH3 SRCHLP SRCH5 SRCH4 RDRET READ READ0 READC1 C1WAIT C1WAIA C1WAIB C1WERR C1DIE C1MPIL C1MPI1 C1SET BLAST RSTC1
C00081 00012 TYPE TYPE1 TYO CPOPJ1 CPOPJ DTEXX KLTYO KLTYI TYI KLTYI1 POPCJ TYICAN FILTYP PPNTYP TYPSIX TYPSI1 TWAIT OCTTYP OCTTY1
C00088 00013 C1ZERO C1APT C1BPT C1PH C1ZEND C1FRST C1ERR C1PTP C1PPTP C1CIFI ZZZ C1MRTC C1CCHR C1MRTD C1WCHN RCLTAB XBUF LPDL LPDL PDL ERRCNT RECORD NXTTRK SYMPNT SYSLOC PATCH PATCH1 LODCNT LODNXT XFRCNT STARTA KASIM MUCKFL ZERFLG FHILOC UPPRST TIBFLN TIBUF FNAM FEXT FPPN DEFDEV DEFEXT DEFPPN FDEV
C00096 00014 FDZBEG DIORG ICCW RH2CYL MAXUNI DSKTYP NUMCYL NUMSCL NUMSTK STRNAM RMXDRV DSKTAB FDZEND NDSKOP NDSKLZ PAGSIZ HOMNAM HOMSNM HOMLUN HOMHOM HOMRXB HOMSIZ HOMFSN HOMCOD HOMSLF CODHOM ICA ENTFLG MAXCHN MAXDRV RH0 .RHRAE .RHMBR .RHCTE .RHMBE .RHSTP .RHDON RHERR LR R4%CSR R4%CRC R4%RIP R4%CPA R4%CRD R4%DSR .RPERR .RPMOL .RPDRY R4%ATN R4%DST R4%DTR R4%TYP R4%DC .RHSBR .RHSTR RCLP STLW R4%TYP .R4TYP .R5TYP .R6TYP .R7TY1 .R7TY2 .R3TYP RHERR NRETRY TIMOUT R4%CRC R4%CDC R4%RIP R4%CPA R4%CRD N.SCL3 N.SCL4 N.SCL7 N.CLP3 N.CLP4 N.CLP6 N.CLP7 N.CLP6 N.CLP7 N.STK3 N.STK7 N.STK4 N.BKPG
C00107 00015 BLAST FDSK FDSK1 FDSK2 FDSK2A FDSK3 FDSK4 CHKSTR MISSTR MISUN2 MISUNI
C00114 00016 GOTDRV GOTDV3 GOTDV4 GOTDV0 GOTDV2
C00121 00017 RHREAD RHWRIT RHCONI RHCONO XIO1 RDDISK RD11 RD0 RD00 RD0A DOOP1 TYPGOO DOOP2 TYPFOO
C00131 00018 CHKHOM CHKHO2 BADUNI DPLUNI BADSTR BADUN2
C00137 00019 FF
C00138 ENDMK
C⊗;
;⊗ TYPXFR DEBSW DSKDSW DSKDBG KLBOOT RHDSK FT1DSK EXTNEW KACODE NPACKS EXTNEW F A B C D E H J K L M P1 P2 P3 P4 T1 T2 T3 N T TT P HILOC NUFDWD RBO CUADR APR PI KLPAG CCA TTY C1A C1B DTE0 DTFLG DTF11 DTCMD DONG11 SWEEPB PIOFF DSTART DSTART KLEPT A%FP0 KLEPT R2WLSH RECSIZ RTLSIZ DATRPB RTLSIZ DATRPB WDPCHN DATSIZ BLKSIZ
;ASSEMBLY SWITCHES, TITLE AND AC DEFINITIONS
;"BOOT" means the program that's loaded into 11 memory that runs in response to
;the DS command in KLDCP.
;
;"DSKDMP" means the program that's run by BOOT. It generally has DDT and a
;file name scanner, etc.
TYPXFR←←0 ;Nonzero to type out a character for each disk xfer done OK
DEBSW←←0 ;If BOOT, 0 for paper tape, 1 for DECtape with EDDT
;If DSKDMP, 0 for real DSKDMP, 1 for DSKDMP with EDDT
DSKDSW←←0 ;0 for BOOT, 1 for DSKDMP
DSKDBG←←0 ;1 for being able to load DSKDMP with EDDT, fixes symb tab ptr
KLBOOT←←0 ;If BOOT, 1 for KLDCP loadable BOOT, 0 for paper tape
RHDSK←←1 ;Nonzero for RH20 disks, else C1 channel disks
FT1DSK←←1 ;1 if all C1 disk packs are on same controller (not RHDSK)
EXTNEW←←0 ;If BOOT, 0 finds DSKDMP.DMP, 1 finds .NEW, 2 .OLD, 3 .TST
KACODE←←0 ;1 to include run time checks for KA-10 and KASIM microcode
NPACKS←←8 ;number of disk drives on C1 channel
XALL ;suppress macro expansion in listing
DEFINE SWLIST <FOR SWITCH IN (TYPXFR,DEBSW,DSKDSW,DSKDBG,KLBOOT,RHDSK,FT1DSK,EXTNEW)>
DEFINE VALPNT (VAL) <
PRINTS /VAL/
>
PRINTS /SWITCHES ARE:
/
SWLIST <
PRINTS /SWITCH(/
VALPNT (\SWITCH)
PRINTS /) /
>
PRINTS /
/
repeat 0,<
PRINTS /Type new values for these symbols, if any, followed by CONTROL-META-LF
/
.INSERT TTY:
>;repeat 0
SWLIST <
IFDIF <SWITCH><EXTNEW><
IFN SWITCH,<↓SWITCH←←1>
IFE SWITCH,<↓SWITCH←←0>
>;IFDIF
>;SWLIST
IFL EXTNEW,<.FATAL EXTNEW has illegal value, must be 0, 1, 2 or 3.>
IFG EXTNEW-3,<.FATAL EXTNEW has illegal value, must be 0, 1, 2 or 3.>
↓EXTNEW←←EXTNEW
IFN DSKDSW,<KLBOOT←←0>
IFN KLBOOT,<
DEBSW ←← 0
DSKDBG ←← 0
>;IFN KLBOOT
IFN DSKDSW,<
TITLE DSKDMP
>;IFN DSKDSW
IFE DSKDSW,<
IFE EXTNEW,< TITLE BOOT >
IFE EXTNEW-3,< TITLE TBOOT >
IFE EXTNEW-2,< TITLE OBOOT >
IFE EXTNEW-1,< TITLE NBOOT >
>;IFE DSKDSW
F←0
A←1
B←2
C←3
D←4
repeat 0,< ;unused
E←5
H←7
J←10
K←11
L←12
M←13
>;repeat 0
ifn rhdsk,<
P1←5
P2←6
P3←7
P4←10
T1←11
T2←12
T3←13
>;ifn rhdsk
N←14
T←15
TT←16
P←17
HILOC←←135
NUFDWD←←20
IFN DSKDSW,<
;RIGHT HALF F BITS
RBO←←1 ;DOING RUBOUT NOW
>;IFN DSKDSW
IFE RHDSK,<
↓CUADR←←6 ;CONTROL UNIT ADDRESS
>;IFE RHDSK
;Device codes
APR←←0
PI←←4
KLPAG←←10
CCA←←14
TTY←←120
IFE RHDSK,<
C1A←←140
C1B←←144
>;IFE RHDSK
DTE0←←200
;KL10 PARAMETERS, offsets within EPT
DTFLG←←444 ;DTE20 OPERATION COMPLETE FLAG
DTF11←←450 ; FROM 11 ARGUMENT
DTCMD←←451 ; TO 11 COMMAND
IFN KACODE,<
DEFINE SKPKA <CONSO TTY,1B28> ;SKIP IF THIS IS THE KA10
DEFINE SKPKL <CONSZ TTY,1B28> ;SKIP IF THIS IS THE KL10
>;IFN KACODE
IFE KACODE,<
;DEFINE SKPKA <CAI> ;SKIP IF THIS IS THE KA10 (never)
;DEFINE SKPKL <CAIA> ;SKIP IF THIS IS THE KL10 (always)
>;IFE KACODE
DONG11←←20000 ;DTE CONO BIT. REQUEST 11 INTERRUPT
SWEEPB←←200000 ;KL10 APR CONI BIT - SWEEP BUSY
PIOFF←←400
IFN DEBSW,<
LOC 74
JRST DDT↑
IFN DSKDSW,<
LOC 140
274
FF
LOWEST
>;IFN DSKDSW
LOC 300
JRST DDT
IFE DSKDSW,<
JRST BOOT
LOC 100000
>;IFE DSKDSW
IFN DSKDSW,<
JRST DSKDMP
LOC 500000 ;arbitrary I think, used to be 300000
>;IFN DSKDSW
DSTART::
>;IFN DEBSW
IFE DEBSW,<
IFN DSKDSW,<
DSTART←←760000 ;address where DSKDMP code will start
LOC 140
DSTART ;LOCATION FOR LOADING STARTING AT 274
FF ;FIRST FREE
LOWEST ;LOWEST LOCATION USED
LOC 274
PHASE DSTART
>;IFN DSKDSW
>;IFE DEBSW
IFN RHDSK,<
IFE KLBOOT,<
KLEPT←<DSTART-2000>&777000 ;the KL EPT will be in the 2nd previous page
A%FP0←<DSTART-1000>&777000 ;and special disk buffer will follow KLEPT
>;IFE KLBOOT
>;IFN RHDSK
IFE RHDSK,<
KLEPT←←0
>;IFE RHDSK
R2WLSH←←7 ;amount to shift record count to make word count
RECSIZ←←<1⊗R2WLSH> ;size of a data record, in words
IFE RHDSK,<
RTLSIZ←←40 ;size of retrieval disk sector in words
DATRPB←←=18 ;data records per block
>;IFE RHDSK
IFN RHDSK,<
RTLSIZ←←200 ;size of retrieval disk sector in words
DATRPB←←=8 ;data records per block
WDPCHN←←4 ;number of words in logout area of a single RH20 channel
>;IFN RHDSK
DATSIZ←←DATRPB*RECSIZ ;size of disk block, not counting retrieval area
BLKSIZ←←DATSIZ+RTLSIZ ;size of disk block in words, incl retrieval area
;⊗ PTPC PTR PNCHGO GO1 GO2 PUNCHC PUNCH RIMLDR RIMLDL RIMPDL OBUF BOOTLO BOOTBG BOOTBG XBUF XBUF BOOTBG BOOTBG XBUF NDATA BDATA KLEPT A%FP0
;WRITE OUT RIM FORMAT BOOT, PNCHGO
IFE DSKDSW,<
IFE KLBOOT,<
IFE DEBSW,<
PTPC←←1
PTR←←104
LOC 200
PNCHGO: RESET
MOVE P,[-20,,RIMPDL]
INIT PTPC,13
SIXBIT /PTP/
OBUF,,
JRST 4,.
MOVSI C,-RIMLDL
GO1: MOVE A,RIMLDR(C)
PUSHJ P,PUNCH
AOBJN C,GO1
MOVEI D,0 ;INITIALIZE CHECKSUM
MOVE A,[BOOTBG,,BOOTBG]
PUSHJ P,PUNCHC
MOVSI C,BOOTBG
GO2: MOVE A,BOOTLO(C)
PUSHJ P,PUNCHC ;PUNCH AND CHECKSUM
AOBJN C,GO2
MOVE A,D
PUSHJ P,PUNCH ;PUNCH OUT CHECKSUM
MOVE A,[JRST BOOT]
PUSHJ P,PUNCH
MOVEI A,0
PUSHJ P,PUNCH
EXIT
PUNCHC: ROT D,1
ADD D,A
PUNCH: SOSG OBUF+2
OUT PTPC,
CAIA
JRST 4,.
IDPB A,OBUF+1
POPJ P,
RIMLDR: -17,,0 ;IOWD TO RIM LOADER
CONO PTR,60
HRRI 11,4
CONSO PTR,10
JRST 3
ROT 0,-2(11)
DATAI PTR,@10(11)
XCT 10(11)
XCT 13(11)
SOJA 11,0
CAME 0,17
ADD 0,(17)
SKIPL 17,0
JRST 4,1
AOBJN 17,3
JRST 2
RIMLDL←←.-RIMLDR
RIMPDL: BLOCK 20
OBUF: BLOCK 3
LIT
VAR
LOC 1000
BOOTLO:
IFE RHDSK,<
BOOTBG←←777000
>;IFE RHDSK
IFN RHDSK,<
BOOTBG←←775000 ;need more room for RH version
>;IFN RHDSK
PHASE BOOTBG
XBUF←←BOOTBG-BLKSIZ
>;IFE DEBSW
>;IFE KLBOOT
>;IFE DSKDSW
IFN DEBSW,<
IFE DSKDSW,<
XBUF: BLOCK BLKSIZ
>;IFE DSKDSW
>;IFN DEBSW
IFN KLBOOT,<
IFE DEBSW,<
IFE RHDSK,<
BOOTBG←←777000 ;CHANGE TO 777000 WHEN SOME MEMORY IS UP THERE
>;IFE RHDSK
IFN RHDSK,<
BOOTBG←←775000 ;need more room for RH version (allow room for symbols)
>;IFN RHDSK
LOC 140
BOOTBG
FF
LOWEST
LOC 274
PHASE BOOTBG
XBUF←←BOOTBG-BLKSIZ
>;IFE DEBSW
IFN RHDSK,<
NDATA←←100 ;max number of data words outside code loaded in KLDCP
BDATA←←XBUF-NDATA ;place where data area starts
KLEPT←<XBUF-NDATA-2000>&777000 ;the KL EPT will be in the 2nd page preceding XBUF
A%FP0←<XBUF-NDATA-1000>&777000 ;and special disk buffer will follow KLEPT
>;IFN RHDSK
>;IFN KLBOOT
.DATA←←BDATA ;initialize address to beginning of data area
DEFINE DATAWD(SYM,LEN)<
SYM←.DATA
.DATA←←.DATA+LEN ;allocate LEN words at SYM
IFG .DATA-BDATA-NDATA,<.FATAL Increase NDATA (data area size) and recompile>
>;DEFINE
;⊗ C1SBI C1RSI C1SRUN C1CONT C1SCH C1RST C1CCIF C1INTE C1INTD C1SCF1 C1CCF1 C1MPCN C1LCD C1LPT C1SYSR C1SCAN C1SDIA CIF CF1 CF2 C1UCHK
;C1 CHANNEL DEFINITIONS
IFE RHDSK,<
;CONO C1A BITS
C1SBI←←400000 ;SELECT BUS INTERFACE
C1RSI←←40000 ;RESET INTERFACE
C1SRUN←←10000 ;SET CLOCK RUN
C1CONT←←2000 ;CONTINUE CLOCK
C1SCH←←200000 ;SELECT CHANNEL
C1RST←←40000 ;RESET CHANNEL
C1CCIF←←20000 ;CLEAR CHANNEL INTERRUPT FLAG
C1INTE←←10000 ;INTERRUPT ENABLE
C1INTD←←4000 ;INTERRUPT DISABLE
C1SCF1←←2000 ;SET CF1
C1CCF1←←1000 ;CLEAR CF1
C1MPCN←←400 ;CONTINUE MICROPROCESSOR
C1LCD←←20 ;LOAD CODE FROM BITS 32-35
;BITS 32-35 ARE A CODE, BIT 32 IS OFF FOR "SOFTWARE" CODES:
C1LPT←←11 ;LOAD PROGRAM TABLE STARTING ADDRESS
C1SYSR←←2 ;SYSTEM RESET
C1SCAN←←7 ;SCAN PROGRAM TABLE FOR PROGRAMS TO START
C1SDIA←←100000 ;SELECT DIAGNOSTIC FUNCTIONS
;CONI C1A BITS
CIF←←4 ;CHANNEL INTERRUPT FLAG
CF1←←2 ;CHANNEL FLAG 1 (INTERRUPT THE Z80, SET FROM ICH IN CONO)
CF2←←1 ;CHANNEL FLAG 2 (Z80 READY FOR PROGRAM TABLE ADDRESS)
C1UCHK←←2 ;UNIT CHECK IN IBM STATUS BYTE
>;IFE RHDSK
;⊗ C1CMD C1MRT C1JMP C1TIO C1IWC C1BAK C1NATM C1BYTM C1CBYT C1SLE C1CEC C1NOC C1RPT C1CCW C1ISW C1PTPE C1PTNX C1IQF C1PPTR C1PCW C1BW C1STA C1HLT C1LE C1SE C1PE C1NXM C1BPE C1SSE C1PCMA C1STB C1STC C1INST
;C1 CHANNEL DATA AREA PARAMETERS
IFE RHDSK,<
;CHANNEL PROGRAM DEFINITIONS
;LEFT HALF BITS
C1CMD←←100000 ;BITS 0-3 = 10 MEANS (NON-MRT) COMMAND WORD
C1MRT←←040000 ;BITS 0-3 = 04 MEANS MRT COMMAND WORD
C1JMP←←200000 ;BITS 0-3 = 20 MEANS JUMP COMMAND WORD
C1TIO←←020000 ;TEST I/O
C1IWC←←010000 ;IGNORE WORD COUNT
C1BAK←←004000 ;BACKWARDS
C1NATM←←000000 ;NATURAL MODE (MODE IN BITS 7-8)
C1BYTM←←001000 ;BYTE MODE
C1CBYT←←000400 ;COUNT BYTES
;BITS 10-17 ARE THE IBM COMMAND BYTE
;RIGHT HALF BITS
C1SLE←←20 ;STOP ON LENGTH ERROR
C1CEC←←10 ;CHANNEL END CONTINUE
C1NOC←←2 ;NO CHAINING
C1RPT←←1 ;REPEAT UNTIL STATUS MODIFIER IS ON IN ENDING STATUS
;PROGRAM TABLE
C1CCW←←0 ;RELATIVE ADDRESS OF CHANNEL CONTROL WORD
C1ISW←←1 ;INTERRUPT SOURCE WORD
C1PTPE←←100000 ;PARITY ERROR IN PROGRAM TABLE
C1PTNX←←40000 ;NXM IN PROGRAM TABLE
C1IQF←←20000 ;INTERRUPT QUEUE FULL
C1PPTR←←2 ;FIRST PROGRAM POINTER
;PROGRAM HEADER AND PROGRAM
C1PCW←←0 ;RELATIVE ADDRESS OF PROGRAM CONTROL WORD
C1BW←←100 ;BUSY WAIT BIT IN PCW
C1STA←←1 ;STATUS A
;RIGHT HALF BITS
C1HLT←←400000 ;PROGRAM EXECUTED A HALT
C1LE←←200000 ;LENGTH ERROR
C1SE←←100000 ;SELECT ERROR
C1PE←←040000 ;PARITY ERROR
C1NXM←←020000 ;NXM
C1BPE←←010000 ;IBM BUS PARITY ERROR
C1SSE←←002000 ;SIGNAL SEQUENCE ERROR
;LEFT HALF BITS
C1PCMA←←100000 ;1→ERROR POINTER TO BY PC, 0→POINTED TO BY MA
C1STB←←2 ;STATUS B
C1STC←←3 ;STATUS C
C1INST←←4 ;FIRST INSTRUCTION OF CHANNEL PROGRAM
>;IFE RHDSK
;⊗ MFDLOC TRKCYL CYLPK TRKPK NXTQQQ A NXTQQQ NXTQQQ DPTRBP DPTEBP DPTRBP DPTEBP
;FILE SYSTEM PARAMETERS
IFE RHDSK,<
MFDLOC←←1 ;TRACK CONTAINING MFD
TRKCYL←←=19 ;19 HEADS PER CYLINDER
CYLPK←←=815 ;815 CYLINDERS PER PACK
TRKPK←←TRKCYL*CYLPK ;19*815=15485 TRACKS PER PACK
>;IFE RHDSK
;RETRIEVAL INFORMATION
NXTQQQ←←0
DEFINE ZWD (A) <
A←←NXTQQQ
NXTQQQ←←NXTQQQ+1
>
ZWD DDNAM ;FILE NAME
ZWD DDEXT ;FILE EXTENSION,,DATE WRITTEN,CREATION DATE
ZWD DDPRO ;PROTECTION,MODE,TIME,DATE WRITTEN
ZWD DDPPN ;PPN
ZWD DDLOC ;FIRST DISK ADDRESS OF THIS FILE
ZWD DDLNG ;LENGTH OF FILE IN WORDS
ZWD DREFTM
ZWD DDMPTM
ZWD DGRP1R ;FIRST USER RCRD NO. THIS GRP
ZWD DNXTGP ;BLOCK NUMBER OF NEXT GROUP
ZWD DSATID
ZWD DQINFO ;START OF SPECIAL STORAGE FOR LOGIN ETC.
NXTQQQ←←NXTQQQ+3
ZWD DOFFST ;RECORD OFFSET
ZWD DPTR ;RETRIEVAL DATA, 2 BLK NO.'S/WORD
IFE RHDSK,<
DPTRBP←←<POINT 18,DPTR> ;C1 disk format uses half-word retr ptrs
DPTEBP←←<POINT 18,RTLSIZ-1,35> ;byte ptr to last retr ptr
>;IFE RHDSK
IFN RHDSK,<
DPTRBP←←<POINT 36,DPTR> ;RP07 format uses full-word retr ptrs
DPTEBP←←<POINT 36,RTLSIZ-1,35> ;byte ptr to last retr ptr
>;IFN RHDSK
;DSKDMP.DMP FORMAT
COMMENT ⊗
DSKDMP.DMP[SS,SYS] IS AN ORDINARY DUMP FILE EXCEPT THAT IT HAS BEEN
ASSEMBLED WITH A PHASE STATEMENT AND EXPECTS TO BE LOADED HIGH IN
THE FIRST 256K OF CORE. LOCATION 140 OF THE CORE IMAGE THAT WOULD
HAVE BEEN OBTAINED BY LOADING DSKDMP CONTAINS THE STARTING ADDRESS
FOR LOADING. LOCATION 274 IS THE FIRST WORD THAT SHOULD BE LOADED
THERE. LOCATION 141 CONTAINS THE RELOCATED FIRST FREE ADDRESS, 142
CONTAINS THE RELOCATED LOWEST ADDRESS. THESE TWO LOCATIONS ARE USED
ONLY BY THE CNVRT PROGRAM TO MAKE DSKDMP.D10
⊗
;⊗ LOWEST BOOT BOOT1 BOOTL1 BOOTL2 BOOTL3 NOMFD NODSKD NOSYS
;BOOT BEGINS HERE
IFE DSKDSW,<
LOWEST←←.
BOOT: CONO APR,200000 ;RESET
SETZM KASIM
IFN RHDSK,<
CONO KLPAG,KLEPT⊗-9 ;TURN OFF CACHE. set EPT address. TURN OFF MAP
>;IFN RHDSK
IFN KACODE,<
BLKI APR,A ;GET UCODE OPTIONS INTO BITS 0-8 OF A
TLNE A,100000 ;SKIP UNLESS KA SIMULATION UCODE LOADED
SETOM KASIM
>;IFN KACODE
IFN KLBOOT,<
SETZB P1,BDATA ;Channel 0 to P1 for BLAST, set up for BLT
MOVE T1,[BDATA,,BDATA+1] ;Prepare to clear data area
BLT T1,BDATA+NDATA-1 ;Initialize data area to zero
>;IFN KLBOOT
MOVE P,[-LPDL,,PDL-1]
PUSHJ P,BLAST ;RESET THE CHANNEL or read the home blocks
IFN DSKDBG,<
SKIPE N,SYSLOC
JRST BOOT1
>;IFN DSKDBG
IFN RHDSK,<
SKIPN N,DIORG ;get location of the MFD
JRST NOMFD ;none
>;IFN RHDSK
IFE RHDSK,<
MOVEI N,MFDLOC
>;IFE RHDSK
MOVE A,[SIXBIT / SSSYS/]
PUSHJ P,SRCH ;LOOK FOR _SSSYS.UFD IN MFD
JRST NOSYS
MOVE N,3(TT) ;GET ADDRESS
IFN DSKDBG,<
MOVEM N,SYSLOC
>;IFN DSKDBG
BOOT1: MOVE A,[SIXBIT /DSKDMP/]
IFE EXTNEW,< MOVSI B,'DMP' >
IFE EXTNEW-1,< MOVSI B,'NEW' >
IFE EXTNEW-2,< MOVSI B,'OLD' >
IFE EXTNEW-3,< MOVSI B,'TST' >
PUSHJ P,SRCH1 ;LOOK FOR DSKDMP.DMP[SS,SYS]
JRST NODSKD
MOVE N,3(TT) ;GET DISK ADDRESS OF DSKDMP.DMP[SS,SYS]
MOVE T,[-<RTLSIZ+200>,,XBUF]
SETZM RECORD
PUSHJ P,READ0 ;READ RETRIEVAL AND ONE RECORD
MOVE A,XBUF+RTLSIZ+140-74 ;GET LOC 140 OF THE DUMP FILE
MOVE B,XBUF+DDLNG ;GET LENGTH OF DUMP FILE
IFN DSKDBG,<
MOVE C,XBUF+RTLSIZ+JOBSYM↑-74 ;GET POINTER TO SYMBOL TABLE
ADDI C,-274(A) ;RELOCATE IT
MOVEM C,SYMPNT
>;IFN DSKDBG
MOVE C,XBUF+RTLSIZ+JOBSA↑-74 ;GET STARTING ADDRESS
HRRZM C,STARTA
SUBI B,200
MOVEM B,LODCNT ;LENGTH OF REMAINDER OF DUMP FILE
MOVEM A,LODNXT ;STORE ADDRESS TO LOAD INTO
MOVEI B,2
MOVEM B,RECORD ;START AT RECORD 2
MOVE C,[DPTRBP+XBUF] ;set up byte ptr to retr ptrs
MOVEM C,NXTTRK
MOVE T,LODCNT
CAILE T,DATSIZ-200
MOVEI T,DATSIZ-200
JRST BOOTL2
BOOTL1: MOVE T,LODCNT
MOVEI N,1
MOVEM N,RECORD
BOOTL2: ILDB N,NXTTRK
CAILE T,DATSIZ
MOVEI T,DATSIZ
MOVEM T,XFRCNT ;SAVE NUMBER OF WORDS THIS TRANSFER
MOVN T,T ;-NUMBER OF WORDS TO TRANSFER
HRLZ T,T
HRR T,LODNXT ;RH GETS NEXT LOC TO LOAD INTO
PUSHJ P,READ0 ;READ REST OF THIS TRACK
MOVE A,XFRCNT
ADDM A,LODNXT
MOVN A,A
ADDB A,LODCNT
IFN DSKDBG,<
JUMPLE A,BOOTL3 ;ALL DONE
>;IFN DSKDBG
IFE DSKDBG,<
JUMPLE A,@STARTA ;DONE, TRANSFER TO DSKDMP
>;IFE DSKDBG
MOVE A,NXTTRK
CAME A,[DPTEBP+XBUF] ;JUST DID LAST TRACK IN GROUP?
JRST BOOTL1 ;NO, DO NEXT TRACK
MOVE N,XBUF+DNXTGP ;FIRST TRACK OF NEXT GROUP
PUSHJ P,RDRET ;READ RETRIEVAL
MOVE A,[DPTRBP+XBUF] ;set up byte ptr to retr ptrs
MOVEM A,NXTTRK
JRST BOOTL1
IFN DSKDBG,<
BOOTL3: SETOM 37
MOVE A,SYMPNT
MOVEM A,36
JRST @STARTA ;JUMP TO STARTING ADDRESS
>;IFN DSKDBG
NODSKD:
IFE KLBOOT,<
IFE EXTNEW,< SKIPA B,[[ASCIZ /CAN'T FIND DSKDMP.DMP[SS,SYS]/]] >
IFE EXTNEW-1,< SKIPA B,[[ASCIZ /CAN'T FIND DSKDMP.NEW[SS,SYS]/]] >
IFE EXTNEW-2,< SKIPA B,[[ASCIZ /CAN'T FIND DSKDMP.OLD[SS,SYS]/]] >
IFE EXTNEW-3,< SKIPA B,[[ASCIZ /CAN'T FIND DSKDMP.TST[SS,SYS]/]] >
>;IFE KLBOOT
IFN KLBOOT,<
IFE EXTNEW,< SKIPA B,[[ASCIZ /DMP?/]] >
IFE EXTNEW-1,< SKIPA B,[[ASCIZ /NEW?/]] >
IFE EXTNEW-2,< SKIPA B,[[ASCIZ /OLD?/]] >
IFE EXTNEW-3,< SKIPA B,[[ASCIZ /TST?/]] >
>;IFN KLBOOT
NOSYS:
IFE KLBOOT,<
MOVEI B,[ASCIZ /CAN'T FIND SSSYS.UFD[1,1]/]
>;IFE KLBOOT
IFN KLBOOT,<
MOVEI B,[ASCIZ /SS,SYS? /]
>;IFN KLBOOT
PUSHJ P,TYPE
JRST 4,.
IFN RHDSK,<
;Here if FDSK (called as BLAST) failed to find right disk structure.
;Original error message has already been typed out.
NOMFD:
IFE KLBOOT,<
MOVEI B,[ASCIZ/
Type RN to try again, looking for any structure.
/]
PUSHJ P,TYPE
>;IFE KLBOOT
JRST 4,.+1
SETZM FDEV ;set to accept any structure this time
JRST BOOT
>;IFN RHDSK
>;IFE DSKDSW
;⊗ LOWEST DSKDMP DSKDM0 DSKDM1 DSKDM2 DSKDL DSKDL2 DSKDL1 DSKDRO DSKDAL DSKAL1 QQQ DSKDGO CMDS NCMDS CMDDSP SSTRTA SSTRT1 SSTRT2 START LOADGO NOMUCK MERGE LOAD LOADN LOADIT LDIT0 LDIT0A LDIT1 LDIT3 LDIT4 LDIT2 LDLP LDLP1 LDLP3 FILES DUMP KILL NSA FNF
;DSKDMP BEGINS HERE
IFN DSKDSW,<
LOWEST←←.
DSKDMP: JFCL FDZBEG ;start with pointer to data area
MOVE P,[-LPDL,,PDL-1]
CONO APR,200000
CONO PI,10000
IFN KACODE,<
SKPKL
JRST DSKDM1
>;IFN KACODE
CONSZ APR,SWEEPB ;WAIT FOR SWEEP BUSY TO FALL
JRST .-1
CONSO KLPAG,600000 ;IS THE CACHE ON ALREADY?
JRST DSKDM0 ;NO.
BLKO CCA, ;VALIDATE CORE
CONSZ APR,SWEEPB
JRST .-1
DSKDM0:
IFN RHDSK,<
SETZM KLEPT ;clear the channel logout areas
MOVE A,[KLEPT,,KLEPT+1]
BLT A,KLEPT+MAXCHN*WDPCHN-1 ;clear all channels' logout areas
>;IFN RHDSK
CONO KLPAG,KLEPT⊗-9 ;TURN OFF CACHE. set EPT address. TURN OFF MAP
DATAI CCA,0 ;SWEEP CACHE. INVALIDATE ALL.
CONSZ APR,SWEEPB ;WAIT FOR SWEEP BUSY TO FALL
JRST .-1
IFN KACODE,<
BLKI APR,A ;GET UCODE OPTIONS INTO BITS 0-8 OF A
TLNN A,100000 ;SKIP IF KA SIMULATION UCODE LOADED
JRST DSKDM1
SETOM KASIM
CONO KLPAG,KLEPT⊗-9 ;MAKE SURE EPT IS AT right place
MOVEI C,411
PUSHJ P,DTEXX ;TELL KLDCP TO ENTER KASIM MODE
IFN RHDSK,<
PRINTX This can't possibly work, since EPT isn't where RH routines expect it
;and if EPT is at page 1000, we can't address it with straight-thru map.
>;IFN RHDSK
CONO KLPAG,1000 ;MOVE EPT TO PAGE 1000
PUSHJ P,BLAST ;init the C1 channel or read the RH home blocks
JRST DSKDM2
>;IFN KACODE
DSKDM1: PUSHJ P,BLAST ;init the C1 channel or read the RH home blocks
SETZM KASIM
IFN KACODE,<
SKPKL
CONO TTY,3600 ;CLEAR ALL BUSY AND DONE FLAGS
SKIPN KASIM
>;IFN KACODE
SKIPA B,[SIXBIT / SSYS/]
DSKDM2: MOVE B,[SIXBIT / DSYS/];DIAGNOSTICS LIVE HERE
MOVEM B,DEFPPN
MOVEI F,0
MOVEI B,[ASCIZ /
DSKDMP/]
PUSHJ P,TYPE
IFN KACODE,<
SKIPN KASIM
JRST DSKDL
MOVEI B,[ASCIZ /
KA SIMULATION MICROCODE LOADED
SWITCHES = /]
PUSHJ P,TYPE
DATAI APR,B
PUSHJ P,OCTTYP
>;IFN KACODE
DSKDL: MOVEI B,[ASCIZ /
*/]
PUSHJ P,TYPE
TRZ F,RBO
MOVEI B,0
DSKDL2: MOVE A,[010700,,TIBUF-1]
SETZM TIBUF
MOVE C,[TIBUF,,TIBUF+1]
BLT C,TIBUF+TIBFLN-1
DSKDL1: PUSHJ P,TYI ;GET CHARACTER IN C
CAIN C,177
JRST DSKDRO ;RUBOUT
TRZE F,RBO
JRST [ PUSH P,C
MOVEI C,"\"
PUSHJ P,TYO
POP P,C
PUSHJ P,TYO
CAIE C,15
JRST .+1
MOVEI C,12
PUSHJ P,TYO
MOVEI C,15
JRST .+1 ]
CAIN C,15
JRST DSKDGO
CAIN C,33
JRST DSKDAL ;ALT MODE
CAIN C,"U"-100
JRST DSKDL
IDPB C,A
JRST DSKDL1
DSKDRO: CAMN A,[010700,,TIBUF-1]
JRST DSKDL
MOVEI C,"\"
TRON F,RBO ;SET RUBOUT FLAG, SKIP IF ALREADY ON
PUSHJ P,TYO
LDB C,A
PUSHJ P,TYO
MOVEI C,0
DPB C,A
ADD A,[070000,,]
JUMPGE A,DSKDL1
SUB A,[430000,,1]
JRST DSKDL1
DSKDAL: LDB A,[POINT 7,TIBUF,6] ;GET FIRST CHARACTER
CAIL A,"0"
CAILE A,"9"
CAIA
JRST SSTRTA ;SET STARTING ADDRESS
MOVE A,TIBUF
MOVSI B,-NCMDS
DSKAL1: CAME A,CMDS(B)
AOBJN B,DSKAL1
JUMPL B,DSKDL2 ;JUMP IF FOUND ONE (B REMEMBERS THE COMMAND)
PUSHJ P,QQQ
JRST DSKDL
QQQ: MOVEI B,[ASCIZ / ???/]
JRST TYPE
DSKDGO: JUMPE B,LOADGO ;JUST FILE NAME
JRST @CMDDSP(B) ;DISPATCH ON COMMAND
CMDS: ASCII /L/ ;LOAD
ASCII /F/ ;LIST FILES
ASCII /D/ ;DUMP
ASCII /K/ ;KILL A FILE
ASCII /G/ ;START AT STARTING ADDRESS
ASCII /M/ ;MERGE (LOAD WITHOUT CLEAR)
ASCII /N/ ;LIKE L BUT DOESN'T HACK LOW CORE CELLS
NCMDS←←.-CMDS
CMDDSP: LOAD
FILES
DUMP
KILL
START
MERGE
NOMUCK
SSTRTA: MOVE A,[POINT 7,TIBUF]
MOVEI B,0
SSTRT1: ILDB C,A
CAIL C,"0"
CAILE C,"9"
JRST SSTRT2
LSH B,3
ADDI B,-"0"(C)
JRST SSTRT1
SSTRT2: MOVEM B,STARTA
JRST DSKDL
START: PUSHJ P,TWAIT ;WAIT FOR TTY TO FINISH
SKIPE STARTA
JRST @STARTA
MOVEI B,[ASCIZ /NO STARTING ADDRESS/]
PUSHJ P,TYPE
JRST DSKDL
LOADGO: SETOM ZERFLG
SETOM MUCKFL
PUSHJ P,LOADIT
JRST DSKDL ;COULDN'T DO IT
MOVEI B,[ASCIZ / LOADED/]
PUSHJ P,TYPE
PUSHJ P,TWAIT
SKIPE STARTA
JRST @STARTA ;START IT UP
MOVEI B,[ASCIZ / BUT NO STARTING ADDRESS/]
PUSHJ P,TYPE
JRST DSKDL
NOMUCK: SETOM ZERFLG
SETZM MUCKFL
JRST LOADN
MERGE: SETZM ZERFLG
SETOM MUCKFL
JRST LOADN
LOAD: SETOM ZERFLG
SETOM MUCKFL
LOADN: PUSHJ P,LOADIT
JRST DSKDL ;COULDN'T DO IT
MOVEI B,[ASCIZ / LOADED/]
PUSHJ P,TYPE
JRST DSKDL
;SKIP RETURNS IF SUCCESSFUL
LOADIT: PUSHJ P,FILSET ;SET UP FILE NAME
SKIPN FNAM
JRST QQQ
IFN RHDSK,<
MOVE A,FDEV ;see what structure is requested
CAMN A,STRNAM ;skip if diff structure seen, need to scan disk
SKIPN DIORG ;skip if already have info for this structure
PUSHJ P,FDSK ;find desired structure on the disk
SKIPN N,DIORG ;get location of the MFD
JRST QQQ ;didn't find MFD, msg already typed, type ???
>;IFN RHDSK
IFE RHDSK,<
MOVEI N,MFDLOC
>;IFE RHDSK
MOVE A,FPPN
MOVEM A,DEFPPN
PUSHJ P,SRCH
JRST NSA ;UFD NOT FOUND IN MFD
MOVE N,3(TT) ;DISK ADDRESS OF UFD
MOVE A,FNAM
HLLZ B,FEXT
PUSHJ P,SRCH1
JRST FNF ;FILE NOT FOUND IN UFD
MOVE N,3(TT) ;DISK ADDRESS OF FILE
SKIPN ZERFLG
JRST LDIT0
SETZM 40
MOVE A,[40,,41]
IFE RHDSK,<
BLT A,DSKDMP-1 ;CLEAR CORE UP TO DSKDMP
>;IFE RHDSK
IFN RHDSK,<
BLT A,KLEPT-1 ;CLEAR CORE UP TO DSKDMP, preserve EPT
>;IFN RHDSK
LDIT0: MOVE T,[-<RTLSIZ+200>,,XBUF]
SETZM RECORD
PUSHJ P,READ0 ;READ RETRIEVAL AND ONE RECORD
SETZB C,FHILOC
SETZM STARTA
SKIPN MUCKFL ;SKIP IF MUCKING WITH LOW CORE CELLS
JRST LDIT0A
MOVE C,XBUF+RTLSIZ+JOBSYM↑-74 ;GET POINTER TO SYMBOL TABLE
MOVEM C,SYMPNT ;SAVE FOR LATER
MOVE C,XBUF+RTLSIZ+JOBSA↑-74 ;GET STARTING ADDRESS
HRRZM C,STARTA
MOVE C,XBUF+RTLSIZ+HILOC↑-74 ;ADDRESS OF BEGINNING OF UPPER
MOVEM C,FHILOC
LDIT0A: MOVE B,XBUF+DDLNG ;GET LENGTH OF DUMP FILE
JUMPE C,LDIT1 ;NO UPPER
MOVEI B,-74(C) ;FILE SIZE OF LOWER
SUBI C,1
IORI C,1777 ;LAST ADDRESS OF LOWER
CAIGE C,377777
MOVEI C,377777
ADDI C,1
MOVEM C,UPPRST ;UPPER STARTS HERE
LDIT1: MOVEM B,LODCNT
MOVEI A,74
MOVEM A,LODNXT ;STORE ADDRESS TO LOAD INTO
PUSHJ P,LDLP ;LOAD THE LOWER
SKIPN C,FHILOC ;SKIP IF THERE IS AN UPPER
JRST LDIT2 ;NO UPPER
MOVE B,XBUF+DDLNG
SUBI B,-74(C) ;COMPUTE SIZE OF UPPER
MOVEM B,LODCNT
MOVE B,UPPRST
MOVEM B,LODNXT ;STARTING CORE ADDRESS OF UPPER
MOVE A,RECORD ;NEXT RECORD TO READ IS FIRST REC OF UPPER
CAIN A,DATRPB+1
JRST LDIT3 ;UPPER BEGINS ON A TRACK BOUNDARY
MOVN T,A
ADDI T,DATRPB+1 ;NUMBER OF RECORDS LEFT IN TRACK
IMULI T,200 ;NUMBER OF WORDS LEFT IN TRACK
CAMLE T,LODCNT
MOVE T,LODCNT
LDB N,NXTTRK
PUSHJ P,LDLP3
JRST LDIT2
LDIT3: MOVE A,NXTTRK
CAME A,[DPTEBP+XBUF] ;JUST DID LAST TRACK IN GROUP?
JRST LDIT4
MOVE N,XBUF+DNXTGP
PUSHJ P,RDRET ;READ RETRIEVAL OF NEXT GROUP
MOVE A,[DPTRBP+XBUF] ;set up byte ptr to retr ptrs
MOVEM A,NXTTRK
LDIT4: PUSHJ P,LDLP1 ;LOAD THE UPPER
LDIT2: MOVEI A,-1
MOVEM A,37
MOVE A,SYMPNT
IFN KACODE,<
SKIPE KASIM
MOVEI A,116 ;PDP-6 DDT EXPECTS 36 TO POINT TO SYM PTR
>;IFN KACODE
MOVEM A,36
JRST CPOPJ1
;SET LODNXT TO FIRST LOCATION TO LOAD INTO, LODCNT TO NUMBER OF WORDS TO TRANSFER
;STARTS READING AT THE BEGINNING OF THE GROUP WHOSE RETRIEVAL IS IN XBUF
LDLP: MOVE C,[DPTRBP+XBUF] ;set up byte ptr to retr ptrs
MOVEM C,NXTTRK
LDLP1: MOVE T,LODCNT
MOVEI N,1
MOVEM N,RECORD
ILDB N,NXTTRK
LDLP3: CAILE T,DATSIZ
MOVEI T,DATSIZ
MOVEM T,XFRCNT ;SAVE NUMBER OF WORDS THIS TRANSFER
MOVN T,T ;-NUMBER OF WORDS TO TRANSFER
HRLZ T,T
HRR T,LODNXT ;RH GETS NEXT LOC TO LOAD INTO
PUSHJ P,READ0 ;READ THE TRACK
MOVE A,XFRCNT
ADDM A,LODNXT
MOVN A,A
ADDB A,LODCNT
JUMPLE A,CPOPJ ;DONE
MOVE A,NXTTRK
CAME A,[DPTEBP+XBUF] ;JUST DID LAST TRACK IN GROUP?
JRST LDLP1 ;NO, DO NEXT TRACK
MOVE N,XBUF+DNXTGP ;FIRST TRACK OF NEXT GROUP
PUSHJ P,RDRET ;READ RETRIEVAL
JRST LDLP
FILES: MOVEI B,[ASCIZ /FILES COMMAND NOT IMPLEMENTED YET/]
PUSHJ P,TYPE
JRST DSKDL
DUMP: MOVEI B,[ASCIZ /DUMP COMMAND NOT IMPLEMENTED YET/]
PUSHJ P,TYPE
JRST DSKDL
KILL: MOVEI B,[ASCIZ /KILL COMMAND NOT IMPLEMENTED YET/]
PUSHJ P,TYPE
JRST DSKDL
NSA: MOVEI B,[ASCIZ /NO SUCH AREA - /]
PUSHJ P,TYPE
JRST PPNTYP
FNF: MOVEI B,[ASCIZ /NO SUCH FILE - /]
PUSHJ P,TYPE
JRST FILTYP
;⊗ FILSET FILSE0 FILSE1 FILSIX FILSI1 RADJ RADJ1
;SCAN TIBUF AND SET UP FILE NAME, EXTENSION AND PPN
FILSET:
IFN RHDSK,<
MOVE B,DEFDEV ;set up default structure name (device)
MOVEM B,FDEV
>;IFN RHDSK
MOVE B,DEFPPN
MOVEM B,FPPN
MOVE B,DEFEXT
MOVEM B,FEXT
SETZM FNAM
SETZM FEXT+1
MOVE A,[010700,,TIBUF-1]
PUSHJ P,FILSIX
IFN RHDSK,<
CAIE D,":" ;device given?
JRST FILSE0 ;no, must be filename
MOVEM B,FDEV ;yes, store device name
PUSHJ P,FILSIX ;now read filename
FILSE0:
>;IFN RHDSK
MOVEM B,FNAM
CAIE D,"."
JRST FILSE1
PUSHJ P,FILSIX
HLLZM B,FEXT
FILSE1: CAIE D,"["
POPJ P,
PUSHJ P,FILSIX
PUSHJ P,RADJ
HLLM B,FPPN
CAIE D,","
POPJ P,
PUSHJ P,FILSIX
PUSHJ P,RADJ
HLRM B,FPPN
POPJ P,
FILSIX: MOVEI B,0
MOVE C,[440600,,B]
FILSI1: ILDB D,A ;GET NEXT CHARACTER FROM BUFFER
CAIE D,"."
CAIN D,"["
POPJ P,
CAIE D,","
CAIN D,"]"
POPJ P,
IFN RHDSK,<
CAIN D,":" ;see structure name?
POPJ P, ;yes
>;IFN RHDSK
JUMPE D,CPOPJ
SUBI D,40
TLNE C,770000
IDPB D,C
JRST FILSI1
RADJ: JUMPE B,CPOPJ
RADJ1: TLNE B,77
POPJ P,
LSH B,-6
JRST RADJ1
>;IFN DSKDSW
;⊗ SRCH SRCH1 SRCH2 SRCH3 SRCHLP SRCH5 SRCH4 RDRET READ READ0 READC1 C1WAIT C1WAIA C1WAIB C1WERR C1DIE C1MPIL C1MPI1 C1SET BLAST RSTC1
;SRCH IS GIVEN A FILENAME IN A AND A block IN N.
;SRCH1 IS GIVEN A FILENAME IN A, AN EXTENSION IN B AND A block IN N
SRCH: MOVSI B,'UFD'
SRCH1: PUSHJ P,READ ;READ block N INTO XBUF
SKIPN T,DDLNG+XBUF ;GET FILE LENGTH
POPJ P,
MOVE TT,[DPTRBP+XBUF] ;set up byte ptr to get retr ptrs
IBP TT ;prepare to get second retr ptr (skip first)
MOVEM TT,NXTTRK
SRCH2: MOVE TT,[-DATSIZ,,XBUF+RTLSIZ] ;scan block starting beyond retrieval
SRCH3: HLLZ C,1(TT) ;get file extension
CAMN A,(TT)
CAME B,C
JRST SRCHLP ;not the file we want
JRST CPOPJ1 ;RETURN WITH POINTER IN TT
SRCHLP: SUBI T,NUFDWD ;one less UFD entry left
JUMPLE T,CPOPJ ;jump if no more data in UFD, file not found
ADD TT,[NUFDWD-1,,NUFDWD-1] ;advance to next UFD entry
AOBJN TT,SRCH3 ;jump if more UFD entries
MOVE TT,NXTTRK ;get byte ptr to next block
CAMN TT,[DPTEBP+XBUF] ;JUST DID LAST block IN GROUP?
JRST SRCH4 ;YES, get next group
ILDB N,NXTTRK ;no, get next block within group
SRCH5: PUSH P,T ;SAVE COUNT OF WORDS LEFT TO SEARCH
PUSHJ P,READ ;READ IN THE NEXT block
POP P,T
JRST SRCH2 ;go search the new block
SRCH4: MOVE N,DNXTGP+XBUF ;NUMBER OF FIRST block of NEXT GROUP
MOVE TT,[DPTRBP+XBUF] ;set up byte ptr to get retr ptrs
IBP TT ;prepare to get second retr ptr (skip first)
MOVEM TT,NXTTRK
JRST SRCH5
;RDRET READS RETRIEVAL OF block WHOSE ADDRESS IS IN N
;READ READS ENTIRE block WHOSE ADDRESS IS IN N
RDRET: SKIPA T,[-RTLSIZ,,XBUF] ;read retrieval only into this buffer
READ: MOVE T,[-BLKSIZ,,XBUF] ;read whole block into this buffer
SETZM RECORD ;START READING AT RECORD ZERO within block
READ0:
IFN RHDSK,<
MOVEI TT,(T) ;memory address of transfer
DPB TT,[POINT 22,ICCW,35] ;store physical address (same as virtual addr)
HLRE TT,T ;get negative word count
MOVN TT,TT ;positive word count
CAILE TT,3777 ;max word count for one CCW
JRST 4,. ;word count wouldn't have fit in CCW
DPB TT,[POINT 11,ICCW,13] ;store word count for channel
MOVE T,N ;get record number of transfer
ADD T,RECORD ;add in record offset within WAITS block
IDIV T,HOMSIZ ;record number within unit to TT, logical unit to T
CAMLE T,MAXUNI ;make sure valid unit number
JRST 4,. ;unit number out of range
LDB P1,[POINT 17,DSKTAB(T),17] ;get physical channel number for log. unit
HRRZ P2,DSKTAB(T) ;get physical drive number of logical unit
MOVE T,TT ;record nbr within unit
IDIV T,NUMSCL ;rec nbr within cyl to TT, cyl to T
PUSH P,T ;save cyl
MOVE T,TT ;rec nbr within cyl
IDIV T,NUMSTK ;sector within track to TT, track to T
MOVE P4,TT ;sector in low bits
LSH T,=35-=27 ;move track (head) number to end in bit 27
IOR P4,T ;combine head and sector
IOR P4,[.RHSBR!LR] ;For RH20 SBAR
POP P,T1 ;get back cyl
JRST RDDISK ;tell the channel to do the transfer
>;IFN RHDSK
IFE RHDSK,<
READC1: PUSHJ P,C1MPIL ;HERE WITH WCMA IN T, COMPILE INTO MRT INST
PUSH P,T ;SAVE RECORD NUMBER RETURNED BY C1MPIL
SETZM C1ERR ;CLEAR ERROR COUNT
PUSH P,N+1 ;save AC N+1
IDIVI N,TRKPK ;N←PACK, N+1←TRACK ON PACK
EXCH N+1,(P) ;restore N+1, save track on pack
POP P,T ;T←track on pack
IDIVI T,TRKCYL ;T←CYLINDER, TT←HEAD
DPB T,[POINT 16,C1CCHR,15] ;C C
DPB TT,[POINT 8,C1CCHR,23] ;H
MOVE TT,RECORD
POP P,RECORD
DPB TT,[POINT 8,C1CCHR,31] ;R
MOVE TT,C1WCHN(N) ;GET CHANNEL NUMBER
DPB N,[POINT 4,@C1PPTP(TT),12] ;STORE DISK DRIVE ADDRESS
MOVEI N,4
DPB N,[POINT 5,@C1PPTP(TT),4] ;STORE START CODE
C1WAIT: JUMPN TT,C1WAIB
CONSO C1A,CIF
JRST .-1
MOVEI T,0
EXCH T,C1APT+C1ISW
C1WAIA: TLC T,200000
TLNE T,600000
JRST C1WERR
MOVE T,C1PH+C1STA ;STATUS A WORD
TRNN T,C1HLT
JRST C1WERR
XCT C1CIFI(TT) ;CLEAR INT FLAG
POPJ P,
C1WAIB: CONSO C1B,CIF
JRST .-1
MOVEI T,0
EXCH T,C1BPT+C1ISW
JRST C1WAIA
C1WERR: AOS T,C1ERR
CAIL T,=10
JRST C1DIE
PUSHJ P,BLAST ;re-initialize the C1 channel
MOVEI T,4
DPB T,[POINT 5,@C1PPTP(TT),4] ;START C1 AGAIN
JRST C1WAIT
C1DIE: MOVEI B,[ASCIZ /C1 ERRORS
/]
PUSHJ P,TYPE
JRST 4,.
C1MPIL: PUSH P,A ;HERE WITH WCMA IN T, 1ST RECORD # IN RECORD
PUSH P,B
PUSH P,C
MOVE A,[-=21,,C1MRTD-1] ;PUSH DOWN POINTER FOR DATA POINTERS
MOVE B,RECORD
C1MPI1: HRLZ C,RCLTAB(B) ;GET SIZE OF RECORD
LSH C,4
HRR C,T
TLO C,600000 ;MARK AS DATA PNTR AND 1ST OF THE RECORD
PUSH A,C
ADD T,RCLTAB(B)
ADDI B,1 ;ADVANCE RECORD NUMBER
JUMPL T,C1MPI1
MOVE T,B ;RETURN NEXT RECORD NUMBER IN T
PUSH A,[0]
POP P,C
POP P,B
POP P,A
POPJ P,
C1SET: SETZM C1ZERO
MOVE A,[C1ZERO,,C1ZERO+1]
BLT A,C1ZEND-1
MOVEI A,253
MOVEM A,C1APT+C1CCW
MOVEM A,C1BPT+C1CCW
MOVEI A,C1BW ;BUSY WAIT BIT
MOVEM A,C1PH
MOVE A,[C1JMP,,C1MRTC]
MOVEM A,C1PH+C1INST
MOVE A,[<BYTE (5)37 (8)CUADR⊗4>!C1PH]
MOVEM A,C1APT+C1PPTR
MOVE A,[<BYTE (5)37 (8)<CUADR+1>⊗4>!C1PH]
MOVEM A,C1BPT+C1PPTR
POPJ P,
;See FDSK for the IFN RHDSK version of BLAST; this is the IFE RHDSK version.
BLAST:
;RESET C1 CHANNELS
RSTC1: AOSN C1FRST
PUSHJ P,C1SET ;SET UP C1 DATA AREAS ONCE ONLY
CONO C1A,C1SBI!C1RSI!C1SRUN!C1CONT ;RESET ALL CHANNELS START CLOCK
CONO C1A,C1SCH!C1RST!C1MPCN ;RESET CHAN A AND START UP
CONO C1B,C1SCH!C1RST!C1MPCN ;RESET CHAN B AND START UP
CONO C1A,C1SCH!C1SCF1!C1LCD!C1SYSR ;TELL C1A TO DO A SYSTEM RESET
MOVEI A,100000
CONSZ C1A,CF1 ;WAIT FOR IT TO DROP CF1
SOJG A,.-1
CONO C1B,C1SCH!C1SCF1!C1LCD!C1SYSR ;TELL C1B TOO
MOVEI A,100000
CONSZ C1B,CF1
SOJG A,.-1
CONO C1A,C1SCH!C1SCF1!C1LCD!C1LPT ;INT THE CHANNEL FOR LD ...
CONO C1B,C1SCH!C1SCF1!C1LCD!C1LPT ;...PGM TABLE.
MOVEI A,100000
CONSO C1A,CF2 ;WAIT FOR CHANNEL TO BE READY FOR PGM TBL
SOJG A,.-1
DATAO C1A,C1PTP ;TELL IT WHERE THE PROGRAM TABLE IS
CONO C1A,C1SCH!C1CCF1 ;CLEAR CF1 (TELL IT WE'VE TOLD IT)
MOVEI A,100000
CONSZ C1A,CF2 ;WAIT FOR CHANNEL TO DROP CF2
SOJG A,.-1
MOVEI A,100000
CONSO C1B,CF2 ;REPEAT FOR SECOND CHANNEL
SOJG A,.-1
DATAO C1B,C1PTP+1
CONO C1B,C1SCH!C1CCF1
MOVEI A,100000
CONSZ C1B,CF2
SOJG A,.-1
POPJ P,
>;IFE RHDSK
;⊗ TYPE TYPE1 TYO CPOPJ1 CPOPJ DTEXX KLTYO KLTYI TYI KLTYI1 POPCJ TYICAN FILTYP PPNTYP TYPSIX TYPSI1 TWAIT OCTTYP OCTTY1
TYPE: HRLI B,440700
TYPE1: ILDB C,B
JUMPE C,CPOPJ
PUSHJ P,TYO
JRST TYPE1
TYO: PUSH P,C
CAIN C,33
MOVEI C,"$"
IFN KACODE,<
SKPKA
SKIPE KASIM
CAIA
>;IFN KACODE
JRST KLTYO
IFN KACODE,<
CONSZ TTY,20
JRST .-1
DATAO TTY,C
POP P,C
POPJ P,
>;IFN KACODE
CPOPJ1: AOS (P)
CPOPJ: POPJ P,
DTEXX: MOVEM C,KLEPT+DTCMD
SETZM KLEPT+DTFLG ;CLEAR 11'S RESPONSE FLAG
CONO DTE0,DONG11 ;RING FOR 11
SKIPN KLEPT+DTFLG ;WAIT FOR RESPONSE
JRST .-1
MOVE C,KLEPT+DTF11 ;GET 11'S RESPONSE WORD
POPJ P,
KLTYO: ANDI C,177
PUSHJ P,DTEXX
POP P,C
POPJ P,
IFN DSKDSW,<
KLTYI: MOVEI C,3400
PUSHJ P,DTEXX
JUMPE C,KLTYI
JRST KLTYI1
TYI:
IFN KACODE,<
SKPKA
SKIPE KASIM
CAIA
>;IFN KACODE
JRST KLTYI
IFN KACODE,<
CONSO TTY,40
JRST .-1
DATAI TTY,C
>;IFN KACODE
KLTYI1: ANDI C,177 ;FLUSH PARITY BIT
CAIL C,"a"
CAILE C,"z"
CAIA
SUBI C,40
CAIE C,176
CAIN C,175
MOVEI C,33
CAIN C,12
MOVEI C,15
CAIN C,"U"-100
JRST TYICAN
TRNE F,RBO ;SKIP UNLESS RUBBING OUT
POPJ P, ;DON'T ECHO HERE IF RUBBING OUT
PUSH P,C
PUSHJ P,TYO
CAIE C,15
JRST POPCJ
MOVEI C,12
PUSHJ P,TYO
POPCJ: POP P,C
POPJ P,
TYICAN: MOVEI C,"↑"
PUSHJ P,TYO
MOVEI C,"U"
PUSHJ P,TYO
MOVEI C,"U"-100
TRZ F,RBO
POPJ P,
FILTYP:
IFN RHDSK,<
MOVE D,FDEV
PUSHJ P,TYPSIX
MOVEI C,":"
PUSHJ P,TYO
>;IFN RHDSK
MOVE D,FNAM
PUSHJ P,TYPSIX
MOVEI C,"."
SKIPN D,FEXT
JRST PPNTYP
PUSHJ P,TYO
PUSHJ P,TYPSIX
PPNTYP: MOVEI C,"["
PUSHJ P,TYO
HLLZ D,FPPN
PUSHJ P,TYPSIX
MOVEI C,","
PUSHJ P,TYO
HRLZ D,FPPN
PUSHJ P,TYPSIX
MOVEI C,"]"
JRST TYO
TYPSIX: MOVEI C,0
LSHC C,6
JUMPE C,TYPSI1
ADDI C,40
PUSHJ P,TYO
TYPSI1: JUMPN D,TYPSIX
POPJ P,
TWAIT:
IFN KACODE,<
SKPKA
SKIPE KASIM
CAIA
POPJ P,
CONSZ TTY,20
JRST TWAIT
>;IFN KACODE
POPJ P,
OCTTYP: IDIVI B,10
JUMPE B,OCTTY1
HRLM C,(P)
PUSHJ P,OCTTYP
HLRZ C,(P)
OCTTY1: ADDI C,"0"
JRST TYO
>;IFN DSKDSW
;⊗ C1ZERO C1APT C1BPT C1PH C1ZEND C1FRST C1ERR C1PTP C1PPTP C1CIFI ZZZ C1MRTC C1CCHR C1MRTD C1WCHN RCLTAB XBUF LPDL LPDL PDL ERRCNT RECORD NXTTRK SYMPNT SYSLOC PATCH PATCH1 LODCNT LODNXT XFRCNT STARTA KASIM MUCKFL ZERFLG FHILOC UPPRST TIBFLN TIBUF FNAM FEXT FPPN DEFDEV DEFEXT DEFPPN FDEV
;DISK ADDRESSES AND POINTERS
IFE RHDSK,<
C1ZERO:: ;ZERO FROM HERE TO C1ZEND AT DISKUP
C1APT: BLOCK C1PPTR+1+1 ;CHN CTL WD, INT WD, PGM PTR, END MARK
C1BPT: BLOCK C1PPTR+1+1 ;PROGRAM TABLE FOR SECOND CHANNEL
C1PH: BLOCK C1INST ;PROGRAM HEADER
0 ;JUMP TO PROGRAM
C1ZEND::
C1FRST: -1 ;-1 FIRST TIME THROUGH
C1ERR: 0 ;ERROR COUNT
C1PTP: C1APT ;POINTERS TO PRG TABLES INDEXED BY CHANNEL NUMBER
C1BPT
C1PPTP: C1APT+C1PPTR
C1BPT+C1PPTR
C1CIFI: CONO C1A,C1SCH!C1CCIF ;INST TO CLEAR CIF INDEXED BY CHANNEL NUMBER
CONO C1B,C1SCH!C1CCIF
;WCMAS FOR CONTROL COMMANDS
DEFINE C1WCMA (COUNT,ADDR,REC)<
ZZZ←←0
IFIDN <REC><R><ZZZ←←1>
BYTE (1)1 (1)ZZZ (13)COUNT (22)ADDR
>
C1MRTC: C1MRT!C1NATM!6,,0 ;MRT READ COMMAND
C1CCHR: BYTE (8)0,0,0,0 ;C C H R
BYTE (8)0,DATRPB+1-1,0,0 ;SECTOR, LAST REC, WRAP REC, 0
C1JMP,,C1MRTD ;JUMP TO 1ST DATA POINTER
C1MRTD: BLOCK DATRPB+1
0
'C1WCHN' ;FOR AIDING LOCATING OF THIS TABLE IN CORE FROM DDT
;TABLE OF WHICH DRIVE IS ON WHICH CHANNEL, 0 FOR C1A, 1 FOR C1B
C1WCHN:
IFN FT1DSK,<
1
1
1
1
1
1
1
1
>;IFN FT1DSK
IFE FT1DSK,<
0
1
0
1
0
1
0
1
>;IFE FT1DSK
IFN .-C1WCHN-NPACKS,<.FATAL GUESS WHAT YOU FORGOT TO CHANGE>
RCLTAB: RTLSIZ,,RTLSIZ
REPEAT DATRPB,<
200,,200
>
>;IFE RHDSK
IFN DSKDSW,<
XBUF: BLOCK BLKSIZ
>;IFN DSKDSW
LPDL←←20
IFE KLBOOT,<
PDL: BLOCK LPDL
ERRCNT: 0
RECORD: 0
NXTTRK: 0 ;BYTE POINTER TO DPTR
SYMPNT: 0 ;SYMBOL TABLE POINTER FROM DSKDMP.DMP
IFN DSKDBG,<
SYSLOC: 0 ;DISK ADDRESS OF SSSYS.UFD[1,1]
>;IFN DSKDBG
IFN DSKDSW,<
PATCH: BLOCK 40
PATCH1: BLOCK 40
>;IFN DSKDSW
LODCNT: 0 ;NUMBER OF WORDS IN FILE LEFT TO LOAD
LODNXT: 0 ;NEXT ADDRESS TO LOAD INTO
XFRCNT: 0 ;NUMBER OF WORDS THIS TRANSFER
STARTA: 0 ;DSKDMP'S STARTING ADDRESS
KASIM: 0 ;-1 IF KA SIMULATION UCODE IS RUNNING
>;IFE KLBOOT
IFN DSKDSW,<
MUCKFL: 0 ;-1 IF MUCKING AROUND WITH LOW CORE CELLS
ZERFLG: 0 ;-1 TO ZERO CORE FIRST
FHILOC: 0 ;HILOC OF FILE WE ARE LOADING
UPPRST: 0 ;CORE ADDRESS OF START OF UPPER
TIBFLN←←20
TIBUF: BLOCK TIBFLN
FNAM: 0
FEXT: 0
0
FPPN: 0
IFN RHDSK,<
DEFDEV: SIXBIT /RSK/ ;default structure (DSKDMP)
>;IFN RHDSK
DEFEXT: SIXBIT /DMP/ ;DEFAULT EXTENSION
DEFPPN: SIXBIT / SSYS/ ;DEFAULT PPN
>;IFN DSKDSW
IFN RHDSK,<
FDEV: SIXBIT /RSK/ ;default (and only) structure for BOOT, stru for DSKDMP
>;IFN RHDSK
IFN KLBOOT,<
DATAWD(PDL,LPDL)
DATAWD(ERRCNT,1)
DATAWD(RECORD,1)
DATAWD(NXTTRK,1) ;BYTE POINTER TO DPTR
DATAWD(SYMPNT,1) ;SYMBOL TABLE POINTER FROM DSKDMP.DMP
DATAWD(LODCNT,1) ;NUMBER OF WORDS IN FILE LEFT TO LOAD
DATAWD(LODNXT,1) ;NEXT ADDRESS TO LOAD INTO
DATAWD(XFRCNT,1) ;NUMBER OF WORDS THIS TRANSFER
DATAWD(STARTA,1) ;DSKDMP'S STARTING ADDRESS
DATAWD(KASIM,1) ;-1 IF KA SIMULATION UCODE IS RUNNING
>;IFN KLBOOT
;⊗ FDZBEG DIORG ICCW RH2CYL MAXUNI DSKTYP NUMCYL NUMSCL NUMSTK STRNAM RMXDRV DSKTAB FDZEND NDSKOP NDSKLZ PAGSIZ HOMNAM HOMSNM HOMLUN HOMHOM HOMRXB HOMSIZ HOMFSN HOMCOD HOMSLF CODHOM ICA ENTFLG MAXCHN MAXDRV RH0 .RHRAE .RHMBR .RHCTE .RHMBE .RHSTP .RHDON RHERR LR R4%CSR R4%CRC R4%RIP R4%CPA R4%CRD R4%DSR .RPERR .RPMOL .RPDRY R4%ATN R4%DST R4%DTR R4%TYP R4%DC .RHSBR .RHSTR RCLP STLW R4%TYP .R4TYP .R5TYP .R6TYP .R7TY1 .R7TY2 .R3TYP RHERR NRETRY TIMOUT R4%CRC R4%CDC R4%RIP R4%CPA R4%CRD N.SCL3 N.SCL4 N.SCL7 N.CLP3 N.CLP4 N.CLP6 N.CLP7 N.CLP6 N.CLP7 N.STK3 N.STK7 N.STK4 N.BKPG
IFN RHDSK,<
OPDEF CALL [PUSHJ P,]
OPDEF RET [POPJ P,]
;General assumptions
; Register use:
; P1 Holds the physical channel number 0 ≤ channel < MAXCHN (8)
; P2 Holds the physical unit number 0 ≤ unit < MAXDRV (8)
;(>> matching brackets)
IFE KLBOOT,<
;Data storage
FDZBEG←←. ;start of area initialized to zero by FDSK
DIORG: 0 ;Set up by FDSK with the location of the MFD, from HOMXRB
ICCW: 0 ;Set to a Channel Command Word for transfer
0 ;halt CCW
RH2CYL: 0 ;desired cylinder
MAXUNI: 0 ;Maximum unit number of the structure that was found.
;(This is one less than the number of units in structure.)
DSKTYP: 0 ;Initially zero, the Drive Type of the units in this str.
NUMCYL: 0 ;Number of cylinders/unit for this drive type
NUMSCL: 0 ;Number of sectors/cylinder for this drive type
NUMSTK: 0 ;Number of sectors/track for this drive type
STRNAM: 0 ;Name of structure represented by DIORG and DSKTAB
RMXDRV←←20 ;max number of drives we're prepared to handle
DSKTAB: BLOCK RMXDRV ;Table we set up with one word per drive, indexed
;by logical drive number. Each word will contain:
; 400000!<physical channel>,,<physical unit>
FDZEND←←.-1 ;end of area initialized to zero by FDSK
NDSKOP: 0 ;counts all diskops, successful or not
NDSKLZ: 0 ;counts losing diskops
>;IFE KLBOOT
IFN KLBOOT,<
;Data storage
;FDZBEG←←. ;start of area initialized to zero by FDSK
DATAWD(DIORG,1) ;Set up by FDSK with the location of the MFD, from HOMXRB
DATAWD(ICCW,2) ;Set to a Channel Command Word for transfer, 2nd word is halt
DATAWD(RH2CYL,1);desired cylinder
DATAWD(MAXUNI,1);Maximum unit number of the structure that was found.
;(This is one less than the number of units in structure.)
DATAWD(DSKTYP,1);Initially zero, the Drive Type of the units in this str.
DATAWD(NUMCYL,1);Number of cylinders/unit for this drive type
DATAWD(NUMSCL,1);Number of sectors/cylinder for this drive type
DATAWD(NUMSTK,1);Number of sectors/track for this drive type
DATAWD(STRNAM,1);Name of structure represented by DIORG and DSKTAB
RMXDRV←←20 ;max number of drives we're prepared to handle
DATAWD(DSKTAB,RMXDRV) ;Table we set up with one word per drive, indexed
;by logical drive number. Each word will contain:
; 400000!<physical channel>,,<physical unit>
;FDZEND←←.-1 ;end of area initialized to zero by FDSK
DATAWD(NDSKOP,1);counts all diskops, successful or not
DATAWD(NDSKLZ,1);counts losing diskops
>;IFN KLBOOT
PAGSIZ←←1000 ;words per page
;A%FP0 is defined as the page after KLEPT and is a
;one page data buffer. Home block is read into
;second record of this page. The following
;definitions of home block words are used:
;HOME BLOCK DEFINITIONS
HOMNAM←←A%FP0+200+0 ;SIXBIT /HOM/
HOMSNM←A%FP0+200+3 ;SIXBIT /STRUCTURE NAME/
HOMLUN←A%FP0+200+4 ;XWD TOTAL PACKS, LOGICAL PACK #
HOMHOM←A%FP0+200+5 ;BLOCK # OF OTHER HOME BLK,, BLK # OF THIS HB
HOMRXB←A%FP0+200+10 ;ADR OF INDEX BLOCK OF ROOT DIRECTORY (MFD on WAITS)
HOMSIZ←A%FP0+200+13 ;SIZE OF A UNIT IN SECTORS (records)
HOMFSN←A%FP0+200+173 ;FILE SYSTEM TYPE
HOMCOD←A%FP0+200+176 ;0 ,, CODHOM
HOMSLF←A%FP0+200+177 ;THIS HOME BLOCK #
CODHOM←←707070 ;the special code to mark home blocks
;Constants
ICA←←0 ;Offset from EPT origin to channel 0's Logout area
ENTFLG←←400000 ;Flag in left half of DSKTAB table used to
;distinguish channel 0 unit 0 from a missing entry
MAXCHN←←8 ;maximum number of channels
MAXDRV←←8 ;maximum number of drives per channel
;Device Definitions
; RH20
RH0←←540 ;device number
; RH20 CONO/CONI
.RHRAE←←1B24 ;Clear RAE (In CONI, Register Access Err)
.RHMBR←←1B25 ;Clear RH20 & attached Devices
.RHCTE←←1B26 ;Clear transfer error
.RHMBE←←1B27 ;Enable Massbus Transmitters (also CONI)
.RHSTP←←1B31 ;Stop a hung transfer
.RHDON←←1B32 ;Clear Done (In CONI, Transfer Done)
RHERR←←775120 ;All the RH20 error bits (in CONI)
;Data Bus Parity; Drive Exception
;Long WC; Whort WC; Channel Error
;Drive Response Error; RAE; Overrun
;and Either Command Buffer Full
; RH20 DATAO/DATAI
LR←←1B6 ;Load Register Bit
; RP06 Registers
R4%CSR←←0B5 ;Drive Command Register
; RP06 Drive Commands
R4%CRC←←07 ;Recalibrate
R4%RIP←←21 ;Read-in Preset
R4%CPA←←23 ;Pack Acknowledge
R4%CRD←←71 ;Read Data
R4%DSR←←1B5 ;Drive Status Register
.RPERR←←1B21 ;Composite error
.RPMOL←←1B23 ;Medium On-Line
.RPDRY←←1B28 ;Drive Ready
R4%ATN←←4B5 ;Attention Summary Register
R4%DST←←5B5 ;Drive Sector & Track
R4%DTR←←6B5 ;Drive Type Register
R4%TYP←←777 ;Mask for drive type bits only
R4%DC←←12B5 ;Cylinder Register
.RHSBR←←70B5 ;RH20 Secondary Block Address Reg
.RHSTR←←71B5 ;RH20 Secondary Transfer Control Reg
RCLP←←1B7 ;Reset Command List Pointer
STLW←←1B10 ;Store Ending Status
R4%TYP←←777B35 ;DEVICE TYPE FIELD IN TYPE REGISTER
.R4TYP←←20 ;RP04 DEVICE TYPE CODE
.R5TYP←←21 ;RP05 DEVICE TYPE CODE
.R6TYP←←22 ;RP06 DEVICE TYPE CODE
.R7TY2←←41 ;RP07 DEVICE TYPE CODE (moving head?)
.R7TY1←←42 ;RP07 DEVICE TYPE CODE (fixed head?) (our kind)
.R3TYP←←24 ;RM03 DEVICE TYPE CODE
RHERR←←775120 ;RH10 CONI ERROR BITS
NRETRY←←5 ;NUMBER OF TIMES TO RETRY
TIMOUT←←=50000 ;COUNT FOR SOJG TIMEOUT
repeat 0,<
;R4%CSK←←02B34 ;RP04 SEEK FUNCTION
R4%CRC←←03B34 ;RE-CALIBRATE FUNCTION IN CONTROL REGISTER
R4%CDC←←04B34 ;RP04 DRIVE CLEAR FUNCTION
R4%RIP←←10B34 ;READ-IN PRESET FUNCTION
R4%CPA←←11B34 ;PACK ACKNOWLEDGE FUNCTION IN CONTROL REGISTER
;R4%CWR←←30B34 ;RP04 WRITE FUNCTION
R4%CRD←←34B34 ;RP04 READ FUNCTION
>;repeat 0
N.SCL3←←=148 ;SECTORS PER CYL (RM03)
N.SCL4←←=380 ;SECTORS PER CYL (RP04/RP05/RP06)
N.SCL7←←=1376 ;SECTORS PER CYL RP07
N.CLP3←←=820 ;CYLS PER UNI (RM03)
N.CLP4←←=400 ;CYLS PER UNI (RP04/5)
repeat 0,<
N.CLP6←←=800 ;CYLS PER UNI (RP06)
N.CLP7←←=629 ;CYLS PER UNI (RP07)
>;repeat 0
N.CLP6←←=815 ;CYLS PER UNI (RP06)
N.CLP7←←=630 ;CYLS PER UNI (RP07)
N.STK3←←=30 ;SECTORS PER TRACK (RM03)
N.STK7←←=43 ;SECTORS PER TRACK (RP07)
N.STK4←←=20 ;SECTORS PER TRACK (RP04) (and 05/06?)
N.BKPG←←4 ;number of records per page
;⊗ BLAST FDSK FDSK1 FDSK2 FDSK2A FDSK3 FDSK4 CHKSTR MISSTR MISUN2 MISUNI
;Routine to locate the physical units for a given structure (FDEV).
;Sets up DSKTAB and DIORG if successful.
;Types error msg if appropriate.
BLAST::
FDSK:
IFE KLBOOT,<
SETZB P1,FDZBEG ;Channel 0 to P1, set up for BLT
MOVE T1,[FDZBEG,,FDZBEG+1] ;Prepare to clear data area
BLT T1,FDZEND ;Initialize data area to zero
>;IFE KLBOOT
SETOM MAXUNI ;No highest unit in structure
;; MAP T1,A%FP0 ;Convert addr of FP0 to physical
;; TLZ T1,777760 ;Keep the 22 physical addr bits
MOVEI T1,A%FP0 ;set up physical address of buffer (mapping is off)
TLO T1,(<1B0+1B1+<1000B13>>) ;CCW: Data, Halt, Word Count = 1 page
MOVEM T1,ICCW ;Store first data CCW
;Examine the channel whose number is in P1
FDSK1: MOVEI T1,.RHMBR ;RH20 Reset function
CALL RHCONO ;Reset the RH20
MOVEI T1,.RHMBE ;RH20 Enable function
CALL RHCONO ;Enable Massbus transmitters
CALL RHCONI ;Now read RH CONI, result to T1
TRNN T1,.RHMBE ;Did the enable bit come back?
JRST FDSK4 ;No. No bit means no channel.
;This channel exists.
;; MAP T1,ICCW ;Get physical address of ICCW
;; TLZ T1,777760 ;Keep 22 phys addr bits
MOVEI T1,ICCW ;set up physical address of CCW list (map is off)
TLO T1,(<1B1>) ;Make a JUMP CCW
MOVE T2,P1 ;Get the current channel number
LSH T2,2 ;Shift it to Channel*4
MOVEM T1,KLEPT+ICA(T2) ;Store initial CCW for channel
;Scan to see what physical units are present.
MOVEI P2,0 ;Start at unit 0
;Start on a Unit. Unit number in P2
FDSK2: MOVSI T1,(<R4%DTR>) ;Read the Drive Type register
CALL RHREAD ;Read it
MOVE T2,T1 ;Copy Drive Type to T2
CALL RHCONI ;Check for Register Access Error
TRNN T1,.RHRAE ;Test CONI bits for RAE
JRST FDSK2A ;All is well: a drive responded
MOVEI T1,.RHRAE!.RHMBE ;Must clear RAE. Set ENABLE.
CALL RHCONO ;CONO to clear RAE & set ENABLE
JRST FDSK3 ;Drive doesn't exist. Try next.
;A unit is present. See what kind of drive it is. GOTDRV does the real work.
FDSK2A: CALL GOTDRV ;See what we have here
FDSK3: CAIGE P2,MAXDRV-1 ;Done with all units yet?
AOJA P2,FDSK2 ;No, go do next unit now.
FDSK4: CAIGE P1,MAXCHN-1 ;Checked all channels yet?
AOJA P1,FDSK1 ;No, advance to next channel
;Now see if we found a consistent structure.
SKIPGE T1,MAXUNI ;Now, check for full structure
JRST MISSTR ;Structure not found
CHKSTR: SKIPN DSKTAB(T1) ;Any physical addr for this LUN?
JRST MISUNI ;Bad structure: missing unit
SOJGE T1,CHKSTR ;Loop thru all units
MOVE T2,DSKTYP ;Get the type of this disk
MOVE T1,[N.STK4,,N.SCL4] ;Get sec/trk,,sectors/cylinders for 04, 05, 06
CAIN T2,.R3TYP ;RP03?
MOVE T1,[N.STK3,,N.SCL3] ;Yes
CAIN T2,.R7TY1 ;RP07?
MOVE T1,[N.STK7,,N.SCL7] ;Yes
HRRZM T1,NUMSCL ;Save sec/cyl
HLRZM T1,NUMSTK ;Save sec/trk
RET ;all done with FDSK
MISSTR:
IFE KLBOOT,<
MOVEI B,[ASCIZ/Desired structure not found. /]
>;IFE KLBOOT
IFN KLBOOT,<
MOVEI B,[ASCIZ/Struct? /]
>;IFN KLBOOT
MISUN2:
IFN DSKDSW,<
PUSHJ P,TYPE ;type error msg
SKIPN D,FDEV
MOVE D,['-ANY-'] ;indicate blank structure name, which matches any
JRST TYPSIX ;type device name
>;IFN DSKDSW
IFE DSKDSW,<
JRST TYPE ;type error msg and return
>;IFE DSKDSW
MISUNI:
IFE KLBOOT,<
MOVEI B,[ASCIZ/Structure has unit(s) missing. /]
>;IFE KLBOOT
IFN KLBOOT,<
MOVEI B,[ASCIZ/Units? /]
>;IFN KLBOOT
SETZM DIORG ;don't let us try to use this structure
JRST MISUN2 ;type error msg and return
;⊗ GOTDRV GOTDV3 GOTDV4 GOTDV0 GOTDV2
SUBTTL GOTDRV Examine the Drive and HHome Block to see if we want it
;Initially DSKTYP is zero. When we find the first disk, we set DSKTYP to the
;negative of the drive type number. If we like the home blocks, we set
;DSKTYP to positive and thereafter, we look at only physical units that are
;similar.
GOTDRV: ANDI T2,R4%TYP ;Keep only the device type code
CAIN T2,.R5TYP ;Is this an RP05?
MOVEI T2,.R4TYP ;Yes, make it look like an RP04
IFE KLBOOT,< ;squeeze into KLDCP
CAIN T2,.R7TY2 ;Alternate kind of RP07?
MOVEI T2,.R7TY1 ;Make it the usual kind of RP07
>;IFE KLBOOT
SKIPG T1,DSKTYP ;Are we looking for a specific disk?
JRST GOTDV3 ;Not yet, check if this is allowable
CAMN T2,T1 ;Yes. Is this the same as we want?
JRST GOTDV0 ;Same as we want. Read its home block.
RET ;No. Don't use this one.
;The desired Drive Type has not been selected yet. Check type against all known
;disk types:
GOTDV3: CAIE T2,.R7TY1 ;RP07?
CAIN T2,.R3TYP ;or RM03?
JRST GOTDV4 ;Yes
CAIE T2,.R6TYP ;RP06
CAIN T2,.R4TYP ;or RP04?
JRST GOTDV4 ;Yes. Save type (negated)
RET ;This is no kind of disk for us
GOTDV4: MOVNM T2,DSKTYP ;Save negative drive type till home blocks checked
GOTDV0: MOVE T1,[R4%CSR!LR!R4%CPA] ;Send Pack Acknowledge.
CALL RHWRIT ;Do DATAO. Sets Volume Valid
MOVSI T1,(<R4%DSR>) ;Read device status register
CALL RHREAD ;Via DATAO/DATAI
TRNN T1,.RPMOL ;Is Disk Pack On-Line?
RET ;No. Forget it.
SETZM A%FP0 ;Clear data page
MOVE T1,[A%FP0,,A%FP0+1] ;Set up for the BLT
BLT T1,A%FP0+PAGSIZ-1 ;Zero data page before the Read
CALL RD0 ;Read disk page 0 (records 0,1,2,3)
CALL CHKHOM ;Check the home block
JRST GOTDV2 ;Bad. Try the Backup home block
RET ;Good block, but wrong Structure
MOVMS DSKTYP ;Good block, right structure, set DSKTYP positive
RET
;Primary Home Block was bad. Try reading the Backup home block.
;CHKHOM expects to see the home block in record 1 (words 200:377) of the page.
;So we position the backup home block in record 1 of the page, by starting
;the transfer at record 11. Then record 12 will wind up at words 200:377
GOTDV2: CALL RD11 ;Read records 11,12,13,14
CALL CHKHOM ;Check the backup home block
RET ;Error
RET ;Wrong structure
MOVMS DSKTYP ;OK, set DSKTYP positive.
RET
;⊗ RHREAD RHWRIT RHCONI RHCONO XIO1 RDDISK RD11 RD0 RD00 RD0A DOOP1 TYPGOO DOOP2 TYPFOO
;RH20 Register Read and Write, CONO and CONI. Call with P1 = RH #
;An RH20 register is read by DATAO'ing the specified register number to the RH
;and then DATAI'ing the RH. An RH20 register is written by DATAO'ing the
;specified register number, the LR (load register) bit, and the remainder of
;the data to the RH. After writing the register, a DATAI is performed to
;read the new contents.
RHREAD: TLZ T1,(<LR>) ;Clear LR bit
RHWRIT: TSO T1,P2 ;Insert Drive Number in left half
CALL XIO1 ;Set IO Device Field & do DATAO
DATAO .-.,T1 ;Send register select & data to device
CALL XIO1 ;Set IO Device Field & do DATAI
DATAI .-.,T1 ;Read selected register
RET
RHCONI: CALL XIO1 ;Set IO device and do CONI
CONI .-.,T1 ;Read device status
RET
RHCONO: CALL XIO1 ;Set IO device and do CONO
CONO .-.,(T1) ;Set device conditions
RET
;XIO1 Subroutine
; Call with P1 = channel number
; next instruction should be: IOOP 0,Address
;
; Effect of routine is to execute the specified I/O instruction as
; though its device code field were set for the given channel number.
XIO1: PUSH P,@(P) ;Fetch argument, to top of stack
AOS -1(P) ;Skip once to skip over the argument
PUSH P,T3 ;Save AC T3
MOVEI T3,<RH0/4>(P1) ;Produce I/O device code
DPB T3,[POINT 7,-1(P),9] ;Store IO Device Number in instruction
POP P,T3 ;Restore AC
XCT (P) ;Execute the target instruction
CAIA ;Target didn't skip
AOS -1(P) ;Target skipped. Pass the Skip upwards.
ADJSP P,-1 ;Discard the stacked instruction
RET
;RD0: Routine to read page 0 (Records 0,1*,2,3) *=home block
;RD11: Routine to read back home block (Records 11,12*,13,14)
;
; Accepts in P1/ Channel number
; P2/ Unit number
; ICCW/ Channel command word (memory address and length of xfer in words)
; CALL RD0
;
;RDDISK: above args plus:
; T1/ Cylinder number
; P4/ Position word
;Enter here with cylinder number in T1
RDDISK: MOVEM T1,RH2CYL ;save cylinder number till we need it
MOVEI T3,NRETRY ;Initialize Retry counter
JRST RD0A ;Join RD0 but avoid recalibrate
RD11: SKIPA P4,[.RHSBR!LR!0B27!11B35] ;Desired Sector and track
RD0: MOVE P4,[.RHSBR!LR!0B27!0B35] ;For RH20 SBAR
SETZM RH2CYL ;select cylinder 0
MOVEI T3,NRETRY ;Initialize Retry counter
;This is where we come to retry losing disk ops, starting with a recalibrate.
RD00: MOVE T1,[R4%CSR!LR!R4%CRC] ;Recalibrate function
CALL RHWRIT ;Execute Recalibrate
RD0A: MOVSI T1,(<R4%DSR>) ;Select unit status register
CALL RHREAD ;Get drive status
TRNN T1,.RPDRY ;Is drive ready?
JRST RD0A ;No, wait till recalibrate done
MOVE T1,[R4%CSR!LR!R4%RIP] ;Read-in Preset Function
CALL RHWRIT ;Execute read-in preset
SETZM ICCW+1 ;End command list with a HALT
MOVE P3,[.RHSTR!LR!RCLP!STLW!R4%CRD] ;Write a disk READ cmd into the STCR
LDB T1,[POINT 11,ICCW,13] ;get word count from CCW
ADDI T1,RECSIZ-1 ;round up to whole sectors
LSH T1,-R2WLSH ;shift count to make it a sector count
MOVN T1,T1 ;negative sector count
DPB T1,[POINT 10,P3,29] ;put negative sector count in disk READ cmd
;Do a data transfer operation with disk
; Accepts in P3/ DATAO Data ;Data Xfer command for STCR
; P1/ Channel number
; P2/ Unit number
; P4/ Position select word ;For the SBAR
; RH2CYL/ Desired cylinder
HRRZ T1,RH2CYL ;get desired cylinder number
TLO T1,(LR!R4%DC) ;set up DATAO word to select cylinder
CALL RHWRIT ;Write DC, selecting desired cylinder
MOVE T1,P4 ;Get Block Address Word
CALL RHWRIT ;Write it to SBAR
MOVE T1,P3 ;Get the TCR word
CALL RHWRIT ;Write STCR. Start Xfer.
MOVEI T2,TIMOUT ;Get timeout count
DOOP1: CALL RHCONI ;Get RH status
TRNN T1,.RHDON ;RH done? Is operation done?
SOJG T2,DOOP1 ;No. Loop till done or timeout
MOVE P3,T1 ;Copy final CONI (unused??)
MOVEI T1,.RHRAE!.RHCTE!.RHMBE!.RHDON ;Clear Done and errors
CALL RHCONO ;Via CONO to RH
JUMPLE T2,DOOP2 ;Did operation ever finish?
MOVSI T1,(<R4%DSR>) ;Yes. Read disk status
CALL RHREAD ;Get device status
TRNE T1,.RPERR ;Check composite error flag
JRST DOOP2 ;Some drive-detected error
CALL RHCONI ;Get RH status bits
IFE KLBOOT,< ;squeeze into KLDCP
AOS NDSKOP ;count disk ops, successful or not
>;IFE KLBOOT
IFE TYPXFR,<
TRNN T1,RHERR ;Any errors there?
RET ;No errors. Return.
>;IFE TYPXFR
IFN TYPXFR,<
TRNE T1,RHERR ;Any errors there?
JRST DOOP2 ;Yes, try again
MOVEI C,"+" ;indicate successful disk op
MOVE T3,NDSKOP ;get disk op count
SUB T3,NDSKLZ ;only count winners, discount losers
TYPGOO: TRNN T3,000000 ;patch this to limit dot typeout to every 2↑Nth op
PUSHJ P,TYO ;type char for each successful disk op
RET ;No errors. Return.
>;IFN TYPXFR
DOOP2: MOVEI T1,.RHMBR!.RHMBE!.RHCTE!.RHSTP ;Here if errors. Setup CONO:
CALL RHCONO ;Massbus Reset and Enable bits
MOVEI T1,.RHMBE ;Get Massbus Enable
CALL RHCONO ;Enable Channel
MOVE T1,[R4%ATN!LR!377] ;Select Attention Register
CALL RHWRIT ;Clear Attention in all drives
IFE KLBOOT,< ;squeeze into KLDCP
AOS T1,NDSKLZ ;count losing disk ops
>;IFE KLBOOT
IFN TYPXFR,<
MOVEI C,"-" ;indicate losing disk op
TYPFOO: TRNN T1,000000 ;patch this to limit typeout to every 2↑Nth error
PUSHJ P,TYO ;type char for each losing disk op
>;IFN TYPXFR
SOJG T3,RD00 ;Repeat failing operation
RET ;Catch errors elsewhere
;⊗ CHKHOM CHKHO2 BADUNI DPLUNI BADSTR BADUN2
;Check for correct home blocks
; no skip: bad home block
; one skip: wrong structure
; two skips: OK
CHKHOM: MOVS T1,HOMNAM ;Get block name
CAIE T1,'HOM' ;Does it say SIXBIT/HOM/ ?
RET ;Bad.
MOVE T1,HOMCOD ;Get block type code
CAIE T1,CODHOM ;Check it (707070)
RET ;Bad home block
MOVE T1,HOMFSN ;Get file system type, chars 1-4
CAME T1,[BYTE (2)0(8)" "," "(2)0(8)"A","W"]
RET ;Not a WAITS pack
MOVE T1,HOMFSN+1 ;Get characters 5-8 of type
MOVE T2,HOMFSN+2 ;Get characters 9-12 of type
CAMN T1,[BYTE (2)0(8)"T","I"(2)0(8)" ","S"]
CAME T2,[BYTE (2)0(8)" "," "(2)0(8)" "," "]
RET ;Not a WAITS pack
AOS (P) ;At least one skip now.
MOVE T1,HOMSNM ;Get Structure name
SKIPN T2,FDEV ;skip if specific structure requested
JUMPN T1,CHKHO2 ;take any structure with Non-Blank name!
CAME T1,T2 ;Does it match what we want?
RET ;Wrong Structure (one skip)
CHKHO2: SKIPN STRNAM ;Have we identified structure yet?
MOVEM T1,STRNAM ;No, save name of structure found
CAME T1,STRNAM ;Part of same structure already seen?
RET ;No, wrong Structure
HRRZ T1,HOMLUN ;Get logical unit number
CAIL T1,RMXDRV ;Make sure it's in range
JRST BADUNI ;Out of range!
SKIPE DSKTAB(T1) ;Is this unit number defined?
JRST DPLUNI ;Yes. Bad: Duplicate units
HRRZM P2,DSKTAB(T1) ;Store Physical Unit number
MOVEI T2,ENTFLG(P1) ;Phys Channel + entry-used flag
HRLM T2,DSKTAB(T1) ;Store phys channel + flag
HLRZ T1,HOMLUN ;Get number of units in str
SOS T1 ;Convert to maximum unit #
SKIPGE MAXUNI ;Is MAXUNI already set?
MOVEM T1,MAXUNI ;No: set it now.
CAME T1,MAXUNI ;Is this unit the same as others?
JRST BADSTR
MOVE T2,HOMRXB ;Get MFD address
SKIPN DIORG ;Is MFD addr already set?
MOVEM T2,DIORG ;No. Set it.
CAME T2,DIORG ;Must be same as any previous
JRST BADSTR ;But it isn't. Bad: home blocks are inconsistent
JRST CPOPJ1 ;Another skip. A good pack
IFE KLBOOT,<
BADUNI: MOVEI B,[ASCIZ/Unit number out of range./]
JRST BADUN2
DPLUNI: MOVEI B,[ASCIZ/Different drives claim same logical unit number./]
JRST BADUN2
BADSTR: MOVEI B,[ASCIZ/Inconsistent home blocks on different drives./]
>;IFE KLBOOT
IFN KLBOOT,<
BADUNI:
DPLUNI:
BADSTR: MOVEI B,[ASCIZ/CHKHOM? /]
>;IFN KLBOOT
BADUN2: PUSHJ P,TYPE
JRST 4,.
>;IFN RHDSK
;⊗ FF
;XLIST ;LIT and VAR listing suppressed here
LIT
VAR
LIST ;resume listing
FF←←.
IFN DSKDSW,<
IFE DEBSW,<
END DSKDMP
>;IFE DEBSW
IFN DEBSW,<
END 300
>;IFN DEBSW
>;IFN DSKDSW
IFE DSKDSW,<
IFE KLBOOT,<
IFN DEBSW,<
END BOOT
>;IFN DEBSW
IFE DEBSW,<
END PNCHGO
>;IFE DEBSW
>;IFE KLBOOT
IFN KLBOOT,<
END BOOT
>;IFN KLBOOT
>;IFE DSKDSW